from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from sqlalchemy import Column, Integer, String, Boolean, Text, DateTime, ForeignKey

from app.db import Base


class User(Base):
    """
    用户模型，对应数据库中的users表。

    属性:
        - id (Integer): 用户ID，主键。
        - username (String): 用户名，长度限制为32，唯一。
        - password (String): 加密后的密码，长度限制为80。
        - is_admin (Boolean): 是否为管理员，默认为False。
        - posts (relationship): 与Post模型的关联，通过owner字段反向引用。
    """

    __tablename__ = "users"

    id = Column(Integer, primary_key=True)
    username = Column(String(32), unique=True)
    password = Column(String(80))
    is_admin = Column(Boolean, default=False)
    posts = relationship("Post", back_populates="owner")

    def __repr__(self) -> str:
        """
        返回用户对象的可读表示，包括用户名和是否为管理员信息。
        """
        return f"User(username={self.username}, is_admin={self.is_admin})"


class Post(Base):
    """
    帖子模型，对应数据库中的posts表。

    属性:
        - id (Integer): 帖子ID，主键。
        - text (Text): 帖子的文本内容。
        - owner (relationship): 与User模型的关联，表示帖子的作者。
        - owner_id (Integer, ForeignKey): 用户ID，作为外键引用users表的id。
        - created_at (DateTime): 帖子创建时间，服务器默认设置为当前时间。
    """

    __tablename__ = "posts"

    id = Column(Integer, primary_key=True)
    text = Column(Text)
    owner = relationship("User", back_populates="posts")
    owner_id = Column(Integer, ForeignKey('users.id'))
    created_at = Column(DateTime, server_default=func.now())

    def __repr__(self) -> str:
        """
        返回帖子对象的可读表示，展示帖子的部分文本内容（最多50个字符）。
        """
        return f"Post(text={self.text[:min(50, len(self.text)):]})"